"""
应用程序配置管理

这个模块负责加载和管理所有的配置参数，包括：
- API密钥
- 模型配置
- 数据库设置
- 应用程序参数
"""

import os
import logging
from typing import Optional, Dict, Any
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

class Settings:
    """
    应用程序设置类
    
    这个类集中管理所有的配置参数，提供类型安全的配置访问。
    所有的配置都可以通过环境变量进行覆盖。
    """
    
    def __init__(self):
        """初始化设置"""
        self._setup_logging()
        self._load_api_keys()
        self._load_model_settings()
        self._load_database_settings()
        self._load_app_settings()
    
    def _setup_logging(self):
        """设置日志配置"""
        log_level = os.getenv("LOG_LEVEL", "INFO").upper()
        logging.basicConfig(
            level=getattr(logging, log_level),
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            handlers=[
                logging.StreamHandler(),
                logging.FileHandler('langchain_assistant.log')
            ]
        )
        self.logger = logging.getLogger(__name__)
    
    def _load_api_keys(self):
        """加载API密钥配置"""
        # OpenAI配置
        self.OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
        self.OPENAI_API_BASE = os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1")
        
        # Anthropic配置
        self.ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")
        
        # HuggingFace配置
        self.HUGGINGFACE_API_TOKEN = os.getenv("HUGGINGFACE_API_TOKEN")
        
        # 搜索引擎配置
        self.SERPAPI_API_KEY = os.getenv("SERPAPI_API_KEY")
        
        # 验证必需的API密钥
        if not self.OPENAI_API_KEY:
            self.logger.warning("OPENAI_API_KEY未设置，某些功能可能无法使用")
    
    def _load_model_settings(self):
        """加载模型相关设置"""
        # 默认模型配置 - 使用硅基流动支持的模型
        self.DEFAULT_LLM_MODEL = os.getenv("DEFAULT_LLM_MODEL", "Qwen/Qwen2.5-7B-Instruct")
        self.DEFAULT_EMBEDDING_MODEL = os.getenv("DEFAULT_EMBEDDING_MODEL", "BAAI/bge-large-zh-v1.5")
        
        # 模型参数
        self.DEFAULT_TEMPERATURE = float(os.getenv("DEFAULT_TEMPERATURE", "0.7"))
        self.DEFAULT_MAX_TOKENS = int(os.getenv("DEFAULT_MAX_TOKENS", "1000"))
        self.DEFAULT_TOP_P = float(os.getenv("DEFAULT_TOP_P", "1.0"))
        
        # 流式输出设置
        self.ENABLE_STREAMING = os.getenv("ENABLE_STREAMING", "true").lower() == "true"
    
    def _load_database_settings(self):
        """加载数据库相关设置"""
        # ChromaDB设置
        self.CHROMA_PERSIST_DIRECTORY = os.getenv("CHROMA_PERSIST_DIRECTORY", "./chroma_db")
        self.CHROMA_COLLECTION_NAME = os.getenv("CHROMA_COLLECTION_NAME", "langchain_documents")
        
        # Redis设置（用于缓存和会话存储）
        self.REDIS_HOST = os.getenv("REDIS_HOST", "localhost")
        self.REDIS_PORT = int(os.getenv("REDIS_PORT", "6379"))
        self.REDIS_DB = int(os.getenv("REDIS_DB", "0"))
        self.REDIS_PASSWORD = os.getenv("REDIS_PASSWORD")
    
    def _load_app_settings(self):
        """加载应用程序设置"""
        # 应用基本信息
        self.APP_NAME = os.getenv("APP_NAME", "LangChain智能助手")
        self.APP_VERSION = "1.0.0"
        self.DEBUG = os.getenv("DEBUG", "false").lower() == "true"
        
        # 文档处理设置
        self.MAX_DOCUMENT_SIZE = int(os.getenv("MAX_DOCUMENT_SIZE", "10485760"))  # 10MB
        self.CHUNK_SIZE = int(os.getenv("CHUNK_SIZE", "1000"))
        self.CHUNK_OVERLAP = int(os.getenv("CHUNK_OVERLAP", "200"))
        
        # 搜索设置
        self.MAX_SEARCH_RESULTS = int(os.getenv("MAX_SEARCH_RESULTS", "5"))
        self.SIMILARITY_THRESHOLD = float(os.getenv("SIMILARITY_THRESHOLD", "0.7"))
        
        # 会话设置
        self.MAX_CONVERSATION_HISTORY = int(os.getenv("MAX_CONVERSATION_HISTORY", "10"))
        self.SESSION_TIMEOUT = int(os.getenv("SESSION_TIMEOUT", "3600"))  # 1小时
    
    def get_llm_config(self) -> Dict[str, Any]:
        """
        获取LLM配置字典
        
        Returns:
            Dict[str, Any]: LLM配置参数
        """
        return {
            "model": self.DEFAULT_LLM_MODEL,
            "temperature": self.DEFAULT_TEMPERATURE,
            "max_tokens": self.DEFAULT_MAX_TOKENS,
            "top_p": self.DEFAULT_TOP_P,
            "streaming": self.ENABLE_STREAMING
        }
    
    def get_embedding_config(self) -> Dict[str, Any]:
        """
        获取嵌入模型配置
        
        Returns:
            Dict[str, Any]: 嵌入模型配置参数
        """
        return {
            "model": self.DEFAULT_EMBEDDING_MODEL
        }
    
    def get_vector_store_config(self) -> Dict[str, Any]:
        """
        获取向量数据库配置
        
        Returns:
            Dict[str, Any]: 向量数据库配置参数
        """
        return {
            "persist_directory": self.CHROMA_PERSIST_DIRECTORY,
            "collection_name": self.CHROMA_COLLECTION_NAME
        }
    
    def validate_configuration(self) -> bool:
        """
        验证配置的完整性
        
        Returns:
            bool: 配置是否有效
        """
        required_settings = []
        
        # 检查必需的API密钥
        if not self.OPENAI_API_KEY:
            required_settings.append("OPENAI_API_KEY")
        
        if required_settings:
            self.logger.error(f"缺少必需的配置: {', '.join(required_settings)}")
            return False
        
        self.logger.info("配置验证通过")
        return True
    
    def __str__(self) -> str:
        """返回配置的字符串表示（隐藏敏感信息）"""
        return f"""
LangChain助手配置:
- 应用名称: {self.APP_NAME}
- 版本: {self.APP_VERSION}
- 调试模式: {self.DEBUG}
- 默认模型: {self.DEFAULT_LLM_MODEL}
- 嵌入模型: {self.DEFAULT_EMBEDDING_MODEL}
- 向量数据库: {self.CHROMA_PERSIST_DIRECTORY}
- 流式输出: {self.ENABLE_STREAMING}
"""

# 创建全局设置实例
settings = Settings() 